package com.shujia.scala

import java.util

object Demo12Fun2 {
  def main(args: Array[String]): Unit = {

    /**
      * 面向对象编程： 将对象传来传去，对象作为参数，对象作为返回值
      *
      *
      * 面向函数编程： 将函数传来传去， （高阶函数）
      * 1、将函数作为参数
      * 函数式什么类型
      * * 函数的类型由函数参数类型和返回值类型决定
      * *
      * * def fun(str: String): String = str + "java"
      * * 这是一个参数为String返回值为String的函数
      * *
      * 2、以函数作为返回值
      *
      *
      */


    //这是一个参数为Int返回值为String类型的函数
    def fun(str: Int): String = str + "java"


    /**
      *
      * 1、以函数作为参数
      *
      */

    /**
      *
      * fun2是一个普通函数，他的参数是一个函数（参数为String返回值为String类型的函数）
      *
      */


    def fun2(f: String => String) = {

      //调用传进来的函数
      val str: String = f("java")

      println(str)

    }


    //定义一个参数为String返回值为String的函数
    def fun3(str: String): String = {
      str + ":fun3"
    }

    def fun4(str: String): String = {
      str + ":fun4"
    }


    /**
      * 只需要函数的类型和要求的类型一致都可以作为参数传递进去
      *
      */
    fun2(fun3)
    fun2(fun4)


    /**
      * 高阶函数的应用
      *
      */

    val lists: List[Int] = List(1, 2, 4, 5, 6, 7, 8)


    //这是一个参数为Int没有返回值的函数
    def fun6(i: Int) = println(i)


    /**
      * foreach: 遍历集合
      */
    lists.foreach(fun6)


    /**
      * println 是一个参数为Any 没有返回值的函数
      * foreach 需要一个参数为Int没有返回值的函数
      * 由于scala也支持多态，所有可以将println传递给foreach
      *
      */
    lists.foreach(println)



  }
}
